package com.example.statistics.utils

import android.app.Activity
import cpcl.PrinterHelper
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.jetbrains.anko.toast

object PrintUtils {

    /**
     *  字体点阵⼤⼩：（单位：dot）
     *  注意：英⽂固件只⽀持（0和1）。
     *   0：12x24。
     *   1：12x24（中⽂模式下打印繁体），英⽂模式下字体变成（9x17）⼤⼩
     *   2：8x16。
     *   3：20x20。
     *   4：32x32或者16x32，由ID3字体宽⾼各放⼤两倍。
     *   7：24x24或者12x24，视中英⽂⽽定。
     *   8：24x24或者12x24，视中英⽂⽽定。
     *   20：16x16或者8x16，视中英⽂⽽定。
     *   24：24x24或者12x24，视中英⽂⽽定。
     *   55：16x16或者8x16，视中英⽂⽽定。
     *  其它默认24x24或者12x24，视中英⽂⽽定
     */


    private const val DEFAULT_HORIZONTAL_AXIS = "0"

    /**
     * 行间距
     */
    private const val DEFAULT_HORIZONTAL_SPACING = 12

    /**
     * 一行最大dot数
     */
    private const val DEFAULT_MAX_DOT = 576

    private const val TEXT_EIGHT = 8
    private const val TEXT_SIXTEEN = 16
    private const val TEXT_TWENTY_FOUR = 24
    private const val TEXT_THIRTY_TWO = 32
    private val textSize = mapOf(TEXT_EIGHT to "2", TEXT_SIXTEEN to "20", TEXT_TWENTY_FOUR to "24", TEXT_THIRTY_TWO to "4")


    /**
     * 蓝牙连接是否成功
     */
    fun blueToothConnect(activity: Activity, address: String, body: (Boolean) -> Unit) {
        GlobalScope.launch {
            val status = PrinterHelper.portOpenBT(activity, address)
            withContext(Dispatchers.Main) {
                when (status) {
                    0 -> {
                        activity.toast("蓝牙连接成功")
                        body.invoke(true)
                        return@withContext
                    }
                    -1 -> activity.toast("蓝牙连接超时，请检查蓝牙是否打开")
                    -2 -> activity.toast("蓝牙格式异常，请重启后重试")
                    -3 -> activity.toast("不支持打印机设备")
                    else -> activity.toast("蓝牙连接超时，请检查蓝牙是否打开")
                }
                body.invoke(false)
            }
        }
    }


    fun blueToothStatus(activity: Activity): Boolean {
        when (PrinterHelper.getstatus()) {
            0 -> {
                activity.toast("打印机连接成功")
                return true
            }
            2 -> activity.toast("打印机缺纸")
            6 -> activity.toast("打印机开盖")
            else -> activity.toast("打印机连接失败")
        }
        return false
    }

    fun printAreaSize(height: Int): Int {
        // PrinterHelper.printAreaSize(String offset,String Horizontal, String Vertical,String height,String qty)
        val horizontal = "200" //打印机⽔平⽅向dpi（根据实际打印机dpi设置）
        val vertical = "200"// 打印机垂直⽅向dpi（根据实际打印机dpi设置）
        val times = 1
        return PrinterHelper.printAreaSize("0", horizontal, vertical, height.toString(), times.toString())
    }

    fun printTitle(vertical: Int, text: String): Int {
        //对下⾯的字体进⾏加粗（如不需要加粗不⽤添加）
        // PrinterHelper.SetBold("1")
        //对下⾯的字体宽、高放⼤倍数（如不需要不⽤添加）
        //PrinterHelper.SetMag("2", "2")
        val textSize = textSize[TEXT_THIRTY_TWO]
        val index = autoWrapPrinter(text, vertical, TEXT_THIRTY_TWO) { start, str ->
            PrinterHelper.Text(PrinterHelper.TEXT, textSize, "0", DEFAULT_HORIZONTAL_AXIS, start.toString(), str)
        }
        //PrinterHelper.SetBold("0") //关闭加粗
        //PrinterHelper.SetMag("1", "1") //关闭放⼤
        return index
    }

    fun printText(vertical: Int, text: String): Int {
        //⽂本打印：⽂字的⽅向，字体点阵⼤⼩：（单位：dot），字体⼤⼩（该功能被屏蔽统⼀参数传0），横坐标（单位 dot），纵坐标（单位 dot），⽂本数据
        val textSize = textSize[TEXT_TWENTY_FOUR]
        return autoWrapPrinter(text, vertical, TEXT_TWENTY_FOUR) { start, str ->
            PrinterHelper.Text(PrinterHelper.TEXT, textSize, "0", DEFAULT_HORIZONTAL_AXIS, start.toString(), str)
        }
    }


    fun printTextRow(vertical: Int, vararg texts: String): Int {
        val textSize = textSize[TEXT_TWENTY_FOUR]
        val rowSize = DEFAULT_MAX_DOT / texts.size
        texts.forEachIndexed { index, s ->
            val a = if (index == 0) 0 else rowSize * index + TEXT_TWENTY_FOUR * 3
            PrinterHelper.Text(PrinterHelper.TEXT, textSize, "0", (a).toString(), vertical.toString(), s)
        }
        return vertical + DEFAULT_HORIZONTAL_SPACING + TEXT_TWENTY_FOUR
    }


    fun printLine(vertical: Int): Int {
        PrinterHelper.Line("0", vertical.toString(), DEFAULT_MAX_DOT.toString(), (vertical + 1).toString(), "1")
        return vertical + DEFAULT_HORIZONTAL_SPACING
    }


    /**
     *  打印机默认72mm可打印区域，
     *  当设置24点阵时，一个字占据3mm，一行最多打印24个字,
     *  当设置32点阵时。一个字占据4mm，一行最多打印18个字
     */
    private fun autoWrapPrinter(text: String, startAxis: Int, textSize: Int = 24, printer: (Int, String) -> Unit): Int {
        if (textSize !in listOf(8, 16, 24, 32)) {
            return startAxis
        }
        //根据字体大小确认一行打印多少个字
        val textNumber = DEFAULT_MAX_DOT / textSize
        //根据字符串长度确定有几行
        val lines = text.length / textNumber
        var verticalAxis = startAxis
        for (i in 0..lines) {
            val str = if (i == lines) {
                text.substring(i * textNumber, text.length)
            } else {
                text.substring(i * textNumber, (i + 1) * textNumber)
            }
            printer(verticalAxis, str)
            verticalAxis += textSize + DEFAULT_HORIZONTAL_SPACING
        }
        return verticalAxis
    }
}